\documentclass[a4paper,10pt]{report}\input{../0.Préambule/Préambule_cours_prof}\input{0_Préambule_Repré2}\begin{document}

\newpage
\setcounter{chapter}{17}
\chapter{Les dictionnaires}

\section{Un peu d'histoire}

Le mot \og dictionnaire \fg{} a le sens qu'on lui donne en programmation. Il s'agit d'un tableau associatif dans lequel les clés sont des mots et les références sont les définitions de ces mots. Nous pouvons aussi rapprocher à cette notion de dictionnaire un répertoire téléphonique associant des numéros (références) à des noms de personnes (clés).

\medskip
Dans d'autres langages de programmation, les dictionnaires sont plus généralement appelés tableaux associatifs (ou tables d'association), on les retrouve ainsi :

\begin{enumerate}
\item[•] en C++ : classe map
\item[•] en PHP : \$ dico
\item[•] en perl : \% dico 
\item[•] $\dots$
\end{enumerate}

Il s'agit d'un tableau associatif de clés à des valeurs. Si les clés doivent être uniques, les valeurs n'ont pas de restriction de type ou de valeur. Les données du dictionnaire sont modifiables, non ordonnées.

\medskip
Par exemple, on peut se servir d'un dictionnaire pour gérer des stocks de fruits, chaque fruit est alors la clé associée à un nombre correspondant à la quantité de ce fruit. Pour savoir le nombre de pommes par exemple, il faut appeler le dictionnaire avec la clé \og pomme \fg{} , on peut aussi en modifier la valeur (voir ci-dessous)

\section{Commandes utiles}

Quelques commandes Python sur les dictionnaires :

\begin{center}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|p{6cm}|p{10cm}|}
\hline
Déclarer un dictionnaire $D_0$ vide & $D_0$ = \{ \} \\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D=\{ \}}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{  \{ \}}}\\\hline
Déclarer un dictionnaire $D$ avec valeurs & $D$ = $\lbrace$ clé$_1$:valeur$_1$,clé$_2$:valeur$_2$, ... ,clé$_n$:valeur$_n$ $\rbrace$ \\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D=\{ 'pommes':5,'poires':6, 'bananes':2 \} }}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5,'poires':6, 'bananes':2 \} }}\\\hline
Ajouter une valeur à un dictionnaire $D$ & $D$['clé$_x$'] = valeur$_x$ si la clé$_x$existait, la valeur$_x$ lui est désormais associée, sinon elle est crée.\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D['ananas']=4}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5,'poires':6, 'bananes':2, 'ananas':4 \} }}\\\hline
Supprimer une association à un dictionnaire $D$ & del $D$['clé']\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> def D['poires']}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5, 'bananes':2, 'ananas':4 \} }}\\\hline
\end{tabular}
\end{center}

\begin{center}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|p{6cm}|p{10cm}|}
\hline
Vérifier la présence d'une valeur associée à une clé dans $D$ & Opérateur in : 'clé' in D. \quad \quad Le retour est un booléen, indiquant la présence ou non de la clé. Aucune information n'est donnée sur la valeur.\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> 'poires' in D}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{False}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> 'ananas' in D}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{True}}\\\hline
Parcourir les clés d'un dictionnaire $D$ & For clé in D : instruction...\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> for fruit in D :}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{		print('il y a des',fruit,'dans le garde manger')}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{il y a des pommes dans le garde manger}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{il y a des bananes dans le garde manger}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{il y a des ananas dans le garde manger}}\\\hline
Opérer sur une valeur selon la présence d'une clé & if clé in D : instruction ... else : instruction ...\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> if 'ananas' in D:}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...	D['ananas']=D['ananas']+2}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...else :}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...	D['ananas']=2}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5, 'bananes':2, 'ananas':6 \} }}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> if 'kiwi' in D:}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...	D['kiwi']=D['kiwi']+2}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...else :}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{...	D['kiwi']=2}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5, 'bananes':2, 'ananas':6 , 'kiwi':5 \} }}\\\hline
Référencer sous un autre nom $D2$ un dictionnaire $D$ & $D2$ = $D$. \quad \quad  Attention, $D2$ et $D$ sont le même dictionnaire avec deux références différentes\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D2=D}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D2)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':5, 'bananes':2, 'ananas':6 , 'kiwi':5 \} }}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D['pommes']=10}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':10, 'bananes':2, 'ananas':6 , 'kiwi':5 \} }}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D2)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':10, 'bananes':2, 'ananas':6 , 'kiwi':5 \} }}\\\hline
\end{tabular}
\end{center}

\begin{center}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{|p{6cm}|p{10cm}|}
\hline
Créer une copie $D3$ du dictionnaire $D$ & $D3$ = dict($D$). \quad \quad $D3$ et $D$ sont distincts désormais, la modification de l'un n'influence rien chez l'autre.\\\hline
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D3=dict(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> D3['bananes']=8}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':10, 'bananes':2, 'ananas':6 , 'kiwi':5 \} }}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{>>> print(D3)}}\\
\multicolumn{1}{|c}{} &\multicolumn{1}{p{10cm}|}{\edupythoninline{ \{ 'pommes':10, 'bananes':8, 'ananas':6 , 'kiwi':5 \} }}\\\hline
\end{tabular}
\end{center}

\section{Un peu de pratique}

\vspace{-4mm}
\begin{exer1}
Créer un dictionnaire ayant pour clés les prénoms de $5$ personnes de votre choix ainsi que leur date de naissance, puis créer un programme qui demande un prénom et retourne « ’’prénom\_ donné’’ fête son anniversaire le ’’date de naissance associée’’ »
\end{exer1}

\begin{exer1}
Au dictionnaire précédent, rajouter la date de naissance de votre professeur préféré. Faire afficher ce dictionnaire pour vérifier l'ajout, puis vérifier que le programme fonctionne avec l'appel du nom de votre professeur préféré.
\end{exer1}

\begin{exer1}
Votre professeur a cherché à se rajeunir ... il est en fait né $5$ ans, $3$ mois et $3$ jours avant la date annoncée ... Corriger cette valeur sans revenir sur les lignes de code déjà écrites.
\end{exer1}

\begin{exer1}
Créer une fonction qui prend en argument votre dictionnaire et renvoie un texte exprimant les jours d'anniversaires de toutes les personnes présentes dans ce dictionnaire.
\end{exer1}

\begin{exer1}
Créer une copie de votre dictionnaire dans laquelle vous insèrerez, à la place de la date de naissance de votre professeur préféré celle d'un autre professeur, né le $14$ Juillet. L'intérêt de ce dictionnaire étant que, selon le professeur qui analyse votre programme, vous pourrez toujours lui faire croire que c'est lui votre professeur préféré en ouvrant le dictionnaire adapté.
\end{exer1}

\begin{exer2}
Créer fonctions et dictionnaires permettant à un programme de gérer un panier client sur un site de vente en ligne d'un club de basketball. Les articles sont les suivants :
\begin{enumerate}
\begin{tabular}{m{5cm}m{5cm}m{5cm}}
\item[•] Maillot domicile : $50$ \euro &
\item[•] Maillot extérieur : $50$\euro &
\item[•] Short domicile : $20$\euro \\
\item[•] Short extérieur : $20$\euro &
\item[•] Sweet : $35$\euro &
\item[•] Tee-shirt : $12$\euro \\
\item[•] Écharpe VIP : $18$\euro&
\item[•] Écharpe sublimée : $15$\euro &
\item[•] Bonnet : $9,90$\euro \\
\item[•] Casquette snapback : $25$\euro &
\item[•] Casquette filet : $20$\euro &
\item[•] Gourde : $9,90$\euro \\
\item[•] Fanion : $6$\euro &
\item[•] Bracelet brésilien : $3$\euro &
\item[•] Bracelet silicone : $2$\euro \\
\item[•] Porte-clefs : $7,90$\euro &
\item[•] MUG : $10$\euro &
\item[•] Coussin : $19,90$\euro \\
\end{tabular}
\end{enumerate}

Le programme doit pouvoir annoncer à chaque appel du client où il en est : contenu de son panier, nombre total d'articles, prix total avec frais de port de $6$\euro (gratuit au-delà de $70$ euros d'achats). Le programme doit proposer au client :
\begin{enumerate}
\item[•] de modifier la quantité d'un type d'article
\item[•] d'ajouter ou retirer un type d'article
\item[•] de finaliser son achat (retourner alors « préparer votre moyen de paiement »)
\end{enumerate}
\end{exer2}

\begin{exer3} Ajouter des options telles que la demande de taille S, M, L, XL, XXL ou XXL pour chaque vêtement, proposer un flocage des maillots pour $12 \e$, offrir le $4^e$ article (à choisir dans les articles du panier tel que ce soit le moins cher des $4$) ...
\end{exer3}

\end{document}